package com.jinyao.exploit.modules.gen.service.impl;

import com.jinyao.exploit.common.base.service.impl.CrudServiceImpl;
import com.jinyao.exploit.common.utils.StringUtils;
import com.jinyao.exploit.modules.gen.dao.DataBaseDictDao;
import com.jinyao.exploit.modules.gen.dao.TableColumnDao;
import com.jinyao.exploit.modules.gen.dao.TableDao;
import com.jinyao.exploit.modules.gen.entity.Table;
import com.jinyao.exploit.modules.gen.entity.TableColumn;
import com.jinyao.exploit.modules.gen.service.TableService;
import com.jinyao.exploit.modules.gen.util.GenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/***********************************************************************
 * 文件说明：自动生成母表service
 * 创建信息：李晋 2018-10-9 15:10
 * 变更履历： 
 ***********************************************************************/
@Service
@Transactional(readOnly = true)
public class TableServiceImpl extends CrudServiceImpl<TableDao, Table> implements TableService {
    @Autowired
    private TableColumnDao tableColumnDao;
    @Autowired
    private DataBaseDictDao dataBaseDictDao;

    /**
     * 获取物理数据表列表
     * @param table
     * @return
     */
    public List<Table> findTableListFormDb(Table table){
        return dataBaseDictDao.findTableList(table);
    }

    /**
     * 验证表名是否可用，如果已存在，则返回false
     * @param tableName
     * @return
     */
    public boolean checkTableName(String tableName){
        if (StringUtils.isBlank(tableName)){
            return true;
        }
        Table table = new Table();
        table.setName(tableName);
        List<Table> list = baseMapper.selectList(null);
        return list.size() == 0;
    }

    /**
     * 获取物理数据表列表
     * @param table
     * @return
     */
    public Table getTableFormDb(Table table){
        // 如果有表名，则获取物理表
        if (StringUtils.isNotBlank(table.getName())){

            List<Table> list = dataBaseDictDao.findTableList(table);
            if (list.size() > 0){

                // 如果是新增，初始化表属性
                if (table.getId() == 0){
                    table = list.get(0);
                    // 设置字段说明
                    if (StringUtils.isBlank(table.getComments())){
                        table.setComments(table.getName());
                    }
                    table.setJavaName(StringUtils.toCapitalizeCamelCase(table.getName()));
                }

                // 添加新列
                List<TableColumn> columnList = dataBaseDictDao.findTableColumnList(table);
                for (TableColumn column : columnList){
                    boolean b = false;
                    for (TableColumn e : table.getColumnList()){
                        if (e.getName().equals(column.getName())){
                            b = true;
                        }
                    }
                    if (!b){
                        table.getColumnList().add(column);
                    }
                }

                // 删除已删除的列
                for (TableColumn e : table.getColumnList()){
                    boolean b = false;
                    for (TableColumn column : columnList){
                        if (column.getName().equals(e.getName())){
                            b = true;
                        }
                    }
                    if (!b){
                        e.setDeleteFlag(TableColumn.DELETE_FLAG_DELETE);
                    }
                }

                // 获取主键
                table.setPkList(dataBaseDictDao.findTablePK(table));

                // 初始化列属性字段
                GenUtils.initColumnField(table);

            }
        }
        return table;
    }

    @Transactional(readOnly = false)
    public boolean save(Table table) {
        boolean result;
        result = super.save(table);
        // 保存列
        for (TableColumn column : table.getColumnList()){
            column.setTable(table);
            if (column.getId() == null){
                column.preInsert();
                tableColumnDao.insert(column);
            }else{
                column.preUpdate();
                tableColumnDao.updateById(column);
            }
        }
        return result;
    }

    @Transactional(readOnly = false)
    public int delete(Table table) {
        baseMapper.deleteById(table);
        tableColumnDao.deleteByTableId(table.getId());
        return 0;
    }
}
